#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/wait.h>
#include<sys/types.h>



#define SIZE 1024
#define MAX_ARGC 64
#define SEP " "



char* argv[MAX_ARGC];
char pwd[SIZE];
char env[SIZE];
int lastcode = 0;

const char* HostName()
{
  char* hostname = getenv("HOSTNAME");
  if(hostname) return hostname;
  else return "None";
}

const char* UserName()
{
  char* hostname = getenv("USER");
  if(hostname) return hostname;
  else return "None";
}

const char* CurrentWorkDir()
{
  char* hostname = getenv("PWD");
  if(hostname) return hostname;
  else return "None";
}

char* Home()
{
  return getenv("HOME");
}


int Interactive(char out[],int size)
{
  //输出提示符并获取用户输入的命令字符串ls -a -l“”
  printf("[%s@ %s %s]$",UserName(),HostName(),CurrentWorkDir());
  fgets(out,size,stdin);
  out[strlen(out)-1] = '\0';
  return strlen(out);
}

void Split(char in[])
{
  int i = 0;
  argv[i++] = strtok(in,SEP);
  while(argv[i++] = strtok(NULL,SEP)); // 故意将== 写成 = 
}

void Execute()
{
    pid_t id = fork();
    if(id == 0)
    {
    execvp(argv[0],argv);
    exit(1);
    }
    
    int status = 0;
    pid_t rid = waitpid(id,&status,0);
    if(id == rid) lastcode = WEXITSTATUS(status);
  //  printf("run done, rid:%d\n",rid);
}

int  BuildinCmd()
{
  int ret = 0;
  //1.检测是否为内建命令，是1，否0
  if(strcmp(argv[0],"cd") == 0)
  {
    //2.执行
    ret = 1;
    char* target = argv[1]; // cd xxx or cd
    if(!target) target = Home();
    chdir(target);
    
    char temp[1024];
    getcwd(temp,1024);
    
    snprintf(pwd,SIZE,"PWD=%s",temp);
    putenv(pwd);
  }
  else if(strcmp(argv[0],"export") == 0)
  {
    ret = 1;
    if(argv[1])
    {
      strcpy(env,argv[1]);
      putenv(env);
    }
  }
  else if(strcmp(argv[0],"echo") == 0)
  {
      ret = 1;
      if(argv[1] == NULL)
      {
          printf("\n");
      }
      else 
      {
        if(argv[1][0] == '$')
        {
            if(argv[1][1] == '?')
            {
              printf("%d\n",lastcode);
              lastcode = 0;
            }
            else{
              char* e = getenv(argv[1]+1);
              if(e) printf("%s\n",e);

            }
        }
        else{
          printf("%s\n",argv[1]);
        }
      }
  }
  return ret;
}

int main()
{
  while(1){
    char commandline[SIZE];
    //1.打印命令行提示符，获取用户输入的指令
    int n = Interactive(commandline,SIZE);
    if(n == 0) continue;
    
    //2.对子串进行切割
    Split(commandline);
    //3.处理内建命令
    n = BuildinCmd();
    if(n) continue;
    //4.执行这个命令
    Execute();
  }
  return 0;
}






